package cc.dawning.utiming.lklocation.location.utils;

import android.content.Context;
import android.util.Log;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;

import cc.dawning.utiming.lklocation.location.api.MyLocationListener;


/**
 * 位置信息的Utils
 *
 * @author liuxin
 */
public class LocationUtils {

    /**
     * 声明AMapLocationClient类对象
     */
    public AMapLocationClient mLocationClient = null;
    /**
     * 声明定位回调监听器
     */
    public AMapLocationListener mLocationListener = new MyAMapLocationListener();
    /**
     * 声明AMapLocationClientOption对象
     */
    public AMapLocationClientOption mLocationOption = null;
    /**
     * 实体
     */
    private static LocationUtils instance;

    /**
     * 定位监听
     */
    private MyLocationListener listener;

    public static LocationUtils getInstance(Context context, MyLocationListener listener) {
        if (null == instance) {
            synchronized (LocationUtils.class) {
                if (null == instance) {
                    instance = new LocationUtils(context, listener);
                }
            }
        }
        return instance;
    }

    /**
     * 初始化位置信息
     *
     * @param context
     * @param listener
     */
    private LocationUtils(Context context, MyLocationListener listener) {
        this.listener = listener;
        init(context);

    }

    private void init(Context context) {
        //初始化定位
        mLocationClient = new AMapLocationClient(context);
        //设置定位回调监听
        mLocationClient.setLocationListener(mLocationListener);
        //初始化AMapLocationClientOption对象
        mLocationOption = new AMapLocationClientOption();
        //设置定位模式为AMapLocationMode.Hight_Accuracy，高精度模式。
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
        //获取一次定位结果：
        //该方法默认为false。
        mLocationOption.setOnceLocation(false);

        //获取最近3s内精度最高的一次定位结果：
        //设置setOnceLocationLatest(boolean b)接口为true，启动定位时SDK会返回最近3s内精度最高的一次定位结果。如果设置其为true，setOnceLocation(boolean b)接口也会被设置为true，反之不会，默认为false。
        mLocationOption.setOnceLocationLatest(true);
        //设置是否返回地址信息（默认返回地址信息）
        mLocationOption.setNeedAddress(true);
        //设置是否允许模拟位置,默认为false，不允许模拟位置
        mLocationOption.setMockEnable(false);
        //关闭缓存机制
        mLocationOption.setLocationCacheEnable(false);
        //给定位客户端对象设置定位参数
        mLocationClient.setLocationOption(mLocationOption);
        //启动定位
        mLocationClient.startLocation();
    }

    /**
     * 定位监听
     */
    private class MyAMapLocationListener implements AMapLocationListener {

        @Override
        public void onLocationChanged(AMapLocation aMapLocation) {
            if (aMapLocation != null) {
                if (aMapLocation.getErrorCode() == 0) {
                    //获取定位数据成功
                    if (null != listener) {
                        listener.GetLocationSuccess(aMapLocation);
                        mLocationClient.stopLocation();
                    }
                } else {
                    //获取定位失败
                    if (null != listener) {
                        listener.GetLocationError();
                        mLocationClient.stopLocation();
                    }
                }
            } else {
                //获取定位失败
                if (null != listener) {
                    listener.GetLocationError();
                    mLocationClient.stopLocation();
                }
            }
        }
    }
}